package com.swagger.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

/**
 * @Author: Chenyw
 * @Date: 2022/07/05/20:18
 */
@SuppressWarnings("all")
@Configuration
@EnableSwagger2WebMvc
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfiguration {
    /**
     * 注解使用:
     *
     * @Api(tags = {“测试Controller”}) 给controller 起别名 类注解
     * @ApiOperation(“测试demo”) 方法的描述
     * @ApiIgnore 忽略 标注方法 或者 参数 则不生成对应文档
     * @ApiImplicitParams
     * @ApiImplicitParam 俩个配合使用
     * @ApiModel(value = “User”,description = “用户实体”) 标注于实体类
     * @ApiModelProperty(value = “主键”,name = “id”) 标注与实体类的属性
     * ----------------
     * @ApiOperationSupport(author = “lsx”,order = 1) 标注方法上 添加作者 接口排序（Knife4j增强注解：
     * 需要在application.yml中开启增强功能）
     * ----------------
     *
     * ———————建议不使用—————————
     * @ApiParam(name = “a”,value = “用户名”,required = true) 对参数的描述
     */

    @Bean
    public Docket swagger2ConfigDefault() {
        return new Docket(DocumentationType.SWAGGER_2) //选择swagger类型
                .apiInfo(getApiInfo("用户中心", "标注训练平台接口文档"))
                .groupName("user-group")//分组的名称
                .select()  //  选择器
                //方式一: 配置扫描 所有想在swagger界面的统一管理接口。都必须在此包下
                .apis(RequestHandlerSelectors.basePackage("com.cyw"))
                //方式二: 只有当方法上有  @ApiOperation 注解时才能生成对应的接口文档
                //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())  //  指定路径范围   这里表示所有路径
                .build();          //  构建swagger文档对象
    }

    private ApiInfo getApiInfo(String title, String description) {
        return new ApiInfoBuilder()  //设置文档上下文信息
                .title(title)   //  文档标题
                .description(description)        //  简介
                .version("1.0.0")                //  版本
                // 设置联系人  ： 作者   网站地址  邮箱
                .contact(new Contact("Chenyw", "https://www.baidu.com", "1099598733@qq.com"))
                // 服务条款链接
                .termsOfServiceUrl("https://www.baidu.com")
                // 认证许可
                .license("认证许可")
                // 认证许可链接
                .licenseUrl("https://www.baidu.com")
                .build();  //  构建上下文对象a
    }

}
